for i = 1, 5 do
    local m = require('other')
    print('other.a is ', m.a)
    Sleep(5)
end

for i = 1, 5 do
    local m = require('other')
    print('other.a is ', m.a)
    package.loaded[module_name] = nil --再改变值，就会被改变
    Sleep(5)
end

--[[
    1.other模块返回一个local table {a = 100}
    在sleep5之间改变other模块中a的值为101，m.a还是100？ 加载模块之后，直接从
    package.loaded['other']中取table值
2.如何打破require缓存机制？
    package.loaded[module_name] = nil
3.出现的问题
    之前的旧数据可能被其他变量引用，所以旧数据仍然有可能存在
]]


local g = {}
for i = 1, 5 do
    local m = require('other')
    if (i == 1) then
        g = m --g引用的是旧数据，重新require之后，m的数据已经改变，g还是原来的数据，即g.a还是100
    end
    print('other.a is ', m.a)
    Sleep(5)
    package.loaded['other'] = nil
end
--[[
    lua全局表package.loaded 包含require，math，os,other等
    问题1：能否让g重新指向新数据？
    在实际的项目中不太确定有哪些变量引用到了旧的数据，就算知道，那也是侵入式的修改了
    方法1：package.loaded仍引用旧的数据表，只不过与新的数据表交换数据，实现如下

    问题2：模块返回的最好是表数据，这样才能替换已经引用到的旧数据，例如g。
]]

function reload_module(module_name)
    local old_module = package.loaded[module_name] or {}
    package.loaded[module_name] = nil
    require (module_name) --新modle的数据

    local new_module = package.loaded[module_name]
    for k, v in pairs(new_module) do
        old_module[k] = v
    end

    package.loaded[module_name] = old_module
    return old_module
end


--以上代码存在的问题及缺陷
--[[
    1.假设热更的代码中有全局变量，热更模块中修改了全局变量，_G['other']也会被修改，这是正常的
    2.假设热更之前有变量指向该全局变量，该变量也应该被修改才正确
    问题：上面的代码对于全局的数据也要交换才对，但是全局数据的来源是哪里？即无法做到替换该模块的全局变量
]]